package com.lancoo.ccas52.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.lancoo.ccas52.entity.*;
import com.baomidou.mybatisplus.extension.service.IService;
import com.lancoo.ccas52.pojo.common.PageInfo;
import com.lancoo.ccas52.pojo.dto.CssTaskRoundInfo;
import com.lancoo.ccas52.pojo.vo.*;

import java.util.List;

/**
 * <p>
 * 选课计划 服务类
 * </p>
 *
 * @author quin.song
 * @since 2023-01-12
 */
public interface CssTaskInfoService extends IService<CssTaskInfo> {

    /**
     * 根据排课计划 初始化选课计划
     *
     * @param taskInfo
     */
    void addCssTask(TaskInfo taskInfo);

    /**
     * 获取选课任务
     * @param taskId
     * @param type 1预选 2正式选课
     * @return
     */
    CssTaskInfo getCssTaskInfo(Integer taskId,Integer type);

    /**
     * 删除选课数据
     * @param taskIds
     */
    void removeCssInfo(List<Integer> taskIds);

    /**
     * 根据学校id获取全部选课计划
     * @param getCssTask
     * @return
     */
    List<CssTaskRoundInfo> getCssTaskBySchool(GetCssTask getCssTask);

    /**
     * 更新选课任务  轮次-最低开班人数
     * @param cssTaskInfo
     * @return
     */
    CssTaskInfo updateCssTaskInfo(CssTaskInfo cssTaskInfo);

    /**
     * 获取最早轮次开始时间 小于当前时间则返回false
     * @param cssTaskId
     * @return
     */
    Boolean getEarliestRound(Integer cssTaskId);

    /**
     * 批量删除轮次
     * @param selectRound
     * @return
     */
    Boolean removeUselessRound(Integer cssTaskId,List<Integer> selectRound);


    /**
     * 更新或添加选课轮次
     * @param cssTaskRound
     * @return
     */
    CssTaskRound addOrUpdateCssTaskRound(CssTaskRound cssTaskRound);

    /**
     * 根据选课 id和轮次获取所有选课轮次
     * @param cssTaskId
     * @param selectRound
     * @return
     */
    List<CssTaskRound> getCssTaskRound(Integer cssTaskId,Integer selectRound);

    /**
     * 删除选课轮次
     * @param id
     * @return
     */
    Boolean  removeCssTaskRound(Integer id);

    /**
     * 设置选课范围
     * @param cssRanges
     * @param optionIdentify
     * @param roundId
     * @return
     */
    List<CssRange> setRange(List<CssRange> cssRanges,Integer optionIdentify, Integer roundId);

    /**
     * 获取选课范围
     * @param roundIds
     * @param optionIdentify
     * @return
     */
    List<CssRange> getRange(List<Integer> roundIds,Integer optionIdentify);

    /**
     * 获取设置预选课的课程列表
     *
     * @param taskId
     * @param page
     * @param studyNature
     * @param courseTypeId
     * @param courseNature
     * @param collegeId
     * @param keyWord
     * @param state
     * @return
     */
    PageInfo<CoursePlanDto> getCourseAndPreByConditions(Integer taskId, IPage page, Integer studyNature, String courseTypeId,
                                                    Integer courseNature,Integer majorProp, String collegeId, String keyWord, Integer state);

    /**
     * 获取预选课程设置情况
     * @param taskId
     * @return
     */
    PreCourseConfiguredVo getPreCourseSet(Integer taskId);


    /**
     * 获取设置为在线选课的课程
     * @param taskId
     * @param page
     * @param studyNature
     * @param courseTypeId
     * @param courseNature
     * @param collegeId
     * @param keyWord
     * @return
     */
    PageInfo<CoursePlanDto> getFormalCourseBySelect(Integer taskId, IPage page, Integer studyNature, String courseTypeId,
                                                    Integer courseNature,Integer majorProp, String collegeId, String keyWord);

    /**
     * 批量设置预选课课程
     * @param taskId
     * @param preState 1：设置为课程，2：取消设置
     * @param preList
     * @return
     */
    boolean addPreSelectCourse(Integer taskId,int preState, List<PreCourseInput> preList);

    /**
     * 获取预选课程
     *
     * @param taskId
     * @param page
     * @param studyNature
     * @param courseTypeId
     * @param courseNature
     * @param collegeId
     * @param keyWord
     * @param state
     * @return
     */
    PageInfo<CoursePlanDto> getPreByConditions(Integer taskId, IPage page, Integer studyNature, String courseTypeId,
                                                    Integer courseNature,Integer majorProp, String collegeId, String keyWord, Integer state);

    /**
     * 设置预选课程状态
     * @param preSelectId
     * @param operationStatus
     * @return
     */
    boolean setSelectState(Integer preSelectId,Integer operationStatus);

    /**
     * 批量添加禁选学生
     * @param prohibitList
     * @return
     */
    int addProhibitStudent(List<CssProhibitStudentInput> prohibitList);

    /**
     * 批量删除禁选学生
     * @param prohibitIds
     * @return
     */
    int removeProhibitStudent(List<Long> prohibitIds);

    /**
     * 更新学生选课上限
     * @param studentLimitInput
     * @return
     */
    Student updatePlanStudent(StudentLimitInput studentLimitInput);

    /**
     * 获取专业选课上限列表
     * @param taskId
     * @param studyNature
     * @param collegeId
     * @param majorId
     * @param gradeId
     * @param keyWord
     * @param state
     * @return
     */
    PageInfo<Major> getMajorList(Integer taskId, Integer studyNature,  String collegeId, String majorId, String gradeId, String keyWord,Integer state,Integer currentPage,Integer pageSize );

    Boolean addOrUpdateBatchMajorLimit( List<MajorLimitInput> majorLimitInputList);

    /**
     * 统一修改专业选课上限
     * @param cssTaskInfo
     * @return
     */
    Boolean unifiedMajorLimit(CssTaskInfo cssTaskInfo);

}
